import router from "@/router";
import store from "@/store";
import axios from "axios";
import { Message } from "element-ui";
import util from "@/libs/util";

const timeout = 60 * 1000; // 请求延迟

// 创建一个错误
function errorCreate(msg) {
  const err = new Error(msg);
  errorLog(err);
  throw err;
}

// 记录和显示错误
function errorLog(err) {
  // 添加到日志
  store.dispatch("d2admin/log/add", {
    type: "error",
    err,
    info: "数据请求异常"
  });
  // 打印到控制台
  if (process.env.NODE_ENV === "development") {
    util.log.danger(">>>>>> Error >>>>>>");
    console.log(err);
  }
  // 显示提示
  Message({
    message: err.message,
    type: "error",
    duration: 5 * 1000
  });
}

// 创建一个 axios 实例
const service = axios.create({
  timeout // 请求超时时间
});

// 请求拦截器
service.interceptors.request.use(
  config => config,
  error => {
    // 发送失败
    console.log(error);
    Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  result => {
    // 处理业务响应
    if (result.data.code !== 200) {
      const message = result.data.message;
      // 登录失效，后台返回403、直接回到登录页面
      if (
        result.data.code == 403 ||
        (result.data.code == 400 && result.data.message == "请登录")
      ) {
        store.dispatch("d2admin/account/logout").then(() => {
          router.push({
            name: "login"
          }); // 定向到登录页面
        });
      } else {
        if (message) Message.error(message);
      }
      // 错误tips补充
      if (result.response === undefined) {
        result.response = {
          data: { message }
        };
      }
      return Promise.reject(result.data);
    } else {
      return Promise.resolve(result.data);
    }
  },
  error => {
    console.log(error);
    let msg = error.response ? `${error.response.status}   ${error.response.statusText}` : error.message;
    Message.error(msg);
    return Promise.reject(error);
  }
);

export default service;
